typedef Pair<ArrayInt, ArrayInt> PairArray的PairArray对象data初始化问题

来源:百度知道 编辑:UC知道 时间:2024/06/29 21:04:09
template<class T1, class T2>
class Pair
{
private:
T1 a;
T2 b;
public:
Pair(const T1 & aval, const T2 & bval) : a(aval), b(bval) { }
Pair() {}
}

class Wine
{
private:
typedef valarray<int> ArrayInt;
typedef Pair<ArrayInt, ArrayInt> PairArray;
string label;
int years;
PairArray data;

public:
Wine() : label("none"), years(0), data(ArrayInt(),ArrayInt()) {}//1
Wine::Wine(const char * l, int y, const int yr[], const int bot[]): label(l), years(y), data(ArrayInt(yr,y),ArrayInt(bot,y) {}//2
Wine(const char * l, const PairArray & yr_bot);
Wine(const char * l, int y);

};
//1中为什么PairArray的对象data要这样data(ArrayInt(),ArrayInt())在初始化列表中初始化,为什么要带ArrayInt()这个类型参数?

//2中为什么PairArray的对象data为什么要data(ArrayInt(yr,y),ArrayInt(bot,y) )初始化,能不带参数类型而date((yr,y),(bot,y))吗?我

你这个程序里valarray是什么呢?
先说一吧,举个简单的例子,有个类A,我声明一个并赋处值,应该写为
A a = A();
为什么要加后面的括号呢,A()是调用构造函数,生成一个A的临时对象,然后再赋值给a,不能写成A a = A;因为A表示的可能只是一个地址,这个赋值左右根本不是一个概念,只有相同的类型才可赋值。你的程序中data需要两个参数,参数类型都是ArrayInt类型,记住data的参数要得是ArrayInt的对象,而不是着整个类,也不是这个类的地址,ArrayInt()恰恰是调用ArrayInt的构造函数生成的一个临时对象,然后把这两个对象赋给data
再说第二个问题吧,同样的data需要的是ArrayInt的两个对象,只有ArrayInt(yr,y)才算是调用构造函数生成的对象,而(yr,y)只是两个值而已,c++编译器不会认为你写的两个值就是ArrayInt,如果我还有一个类ArrayInt1,也是两个值组成的呢,你说该认为(yr,y)是ArrayInt还是ArrayInt1呢?
不知明白否?